package monpkg.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.server.Unreferenced;
import java.util.List;

import monpkg.dao.AnnuaireDAO;
import monpkg.dao.Dao;
import monpkg.entities.Admin;
import monpkg.entities.Promotion;
import monpkg.entities.Student;

import org.hibernate.bytecode.buildtime.ExecutionException;

/**
 * @author Yannick Bouchot
 * @author Jonathan Romero
 */

public class FAnnuaireImpl extends UnicastRemoteObject implements IAnnuaireImpl, Unreferenced, Remote{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private AnnuaireDAO annuaire;

	protected FAnnuaireImpl() throws RemoteException {
		super();
		annuaire = new Dao();
	}
	
	public void init() throws RemoteException{
	
	}
	/**
	 * methode permettant de creer une DAO
	 */
	public AnnuaireDAO newAnnuaire() throws RemoteException{
		return new Dao();
	}
	/**
	 * methode permettant d'ajouter un etudiant
	 */
	public Student addStudent(Student s) throws RemoteException {
		return annuaire.addStudent(s);
	}
	/**
	 * methode permettant de trouver un etudiant selon sont id
	 */
	public Student findStudent(long id) throws RemoteException {
		return annuaire.findStudent(id);
	}
	/**
	 * methode permettant de trouver tout les etudiants
	 */
	public List<Student> findAllStudents() throws RemoteException {
		return annuaire.findAllStudents();
	}
	/**
	 * methode permettant de mettre a jour un etudiant
	 */
	public Student updateStudent(Student s) throws RemoteException {
		return annuaire.updateStudent(s);
	}
	/**
	 * methode permettant de supprimer un etudiant selon son id
	 */
	public void removeStudent(long id) throws RemoteException {
		annuaire.removeStudent(id);
	}
	/**
	 * methode permettant d'ajouter un admin
	 */
	public Admin addAdmin(Admin a) throws RemoteException {
		return annuaire.addAdmin(a);
	}
	/**
	 * methode permettant de trouver un admin avec son id
	 */
	public Admin findAdmin(long id) throws RemoteException {
		return annuaire.findAdmin(id);
	}
	/**
	 * methode permettant de faire la mise a jour d'un admin
	 */
	public Admin updateAdmin(Admin a) throws RemoteException {
		return annuaire.updateAdmin(a);
	}
	/**
	 * methode permettant de trouver une promotion selon son id
	 */
	public Promotion findPromotion(long id, boolean withStudents)
			throws ExecutionException, RemoteException {
		return annuaire.findPromotion(id, withStudents);
	}
	/**
	 * methode permettant de trouver toute les promotions
	 */
	public List<Promotion> findAllPromotions() throws RemoteException {
		return annuaire.findAllPromotions();
	}
	/**
	 * methode permettant d'ajouter une promotion
	 */
	public void addPromotion(Promotion p) throws ExecutionException,
			RemoteException {
		annuaire.addPromotion(p);
	}
	/**
	 * methode permettant de mettre a jour une promotion
	 */
	public void updatePromotion(Promotion p) throws ExecutionException,
			RemoteException {
		annuaire.updatePromotion(p);
	}
	/**
	 * methode permettant de supprimer une promotion selon son id
	 */
	public void removePromotion(long id) throws ExecutionException,
			RemoteException {
		annuaire.removePromotion(id);
	}

	@Override
	public void unreferenced() {
		//annuaire.close();
	}
}